package Others.DesignPattern.StrategyPattern.Pattern;

import Others.DesignPattern.StrategyPattern.Pattern.Strategy.DiscountCollectMoney;
import Others.DesignPattern.StrategyPattern.Pattern.Strategy.NormalCollectMoney;
import Others.DesignPattern.StrategyPattern.Pattern.Strategy.RebateCollectMoney;

import java.util.Scanner;

public class main {
    public static void main(String[] args) {
        //策略模式

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入消费的金额");
        double money = scanner.nextDouble();

        //完整一些的写法
        Context context = new Context();
        NormalCollectMoney normalCollectMoney = new NormalCollectMoney(money);
        context.setDiscountStrategy(normalCollectMoney);
        context.getDiscountPrice();

        //简单一些的写法
        new Context(new DiscountCollectMoney(money,0.8)).getDiscountPrice();

        new Context(new RebateCollectMoney(money,500,200)).getDiscountPrice();


    }
    //好处，其实策略模式，都能清晰的看见，我需要什么策略，只需要去添加对应的策略即可，然后调用使用即可
    //而不再是像原始那样造成功能的耦合，以及简单工厂那样，造成工厂判断的冗余和耦合--其实使用见到那工厂也能完成相关内容
    //采用工厂+反射的模式，也可以解决，但是没有这个来的清爽--也没有这个参数简单

    //这里其实可以进一步使用--策略+工厂的模式，是客户端界面更加简洁，是界面中只存在Context一个类出现
    //甚至可以使用策略+工厂+反射的模式，将工厂类中的判断直接使用反射省去

}
